09 - Kamera termowizyjna

Wprowadzenie do Systemów Wizyjnych

Politechnika Poznańska, Instytut Robotyki i Inteligencji Maszynowej

Ćwiczenie laboratoryjne 9: kamera termowizyjna

Powrót do spisu treści ćwiczeń laboratoryjnych

Wstęp

Kamery termowizyjne pozwalają na rejestrację promieniowania cieplnego, które jest emitowane przez ciała fizyczne w paśmie podczerwieni bez dodatkowego oświetlania zewnętrznym źródłem światła. Termowizja stosowana jest przykładowo w zastosowaniach związanych ze zdalnym określaniem temperatury, diagnostyką urządzeń mechanicznych lub obwodów elektrycznych, rozwiązaniach z zakresu bezpieczeństwa.

Promieniowanie podczerwone (IR) jest to promieniowanie elektromagnetyczne o zakresie fali od około 0.8 μm do 1000 μm. W porównaniu do światła widzialnego promieniowanie podczerwone charakteryzuje się falami o dłuższej długości. Ich zakres w porównaniu do zakresu światła widzialnego, ultrafioletowego oraz innych typów fal elektromagnetycznych został przedstawiony na poniższym rysunku:

Podczas zajęć wykorzystana zostanie kamera termowizyjna FLIR Lepton 3.5 wraz z modułem PureThermal 2 Smart I/O Module pozwalającym na użycie sensora wizyjnego jako standardowej kamery przy użyciu USB. Pozwala ona na rejestrację pasma podczerwieni o długości fal 8-14 μm, z dokładnością do 0.05°C w zakresie od -10 do 400°C. Wygląd obwodu drukowanego wraz sensorem został przedstawiony na poniższym rysunku.

Wykorzystywany sensor zwraca informacje w postaci 16-bitowej wartości liczbowej (0 - 65535) dla każdego piksela. Wartości temperatury wyznaczane sa przy wykorzystaniu poniższego wzoru:

UWAGA Ta instrukcja wymaga systemu operacyjnego Ubuntu oraz zainstalowanych dodatkowych driverów.

Zadanie wstępne

Podepnij kamerę termowizyjną do portu USB i wykorzystując poniższy kod zapoznaj się z obrazem zwracanym z kamery termowizyjnej konwertowanym do 8-bitowego formatu RGB. Sprawdź wymiary oraz zakres wartości zwracanego obrazu.

import cv2


def camera():
    """Thermal camera 8-bit RGB capture."""

    cap = cv2.VideoCapture(2)

    while True:
        ret, frame = cap.read()
        if not ret:
            print("Cannot connect to the camera.")
            break

        cv2.imshow("Thermal RGB image", frame)

        if cv2.waitKey(10) == ord('q'):
            break


if __name__ == '__main__':
    camera()

Zadania do samodzielnej realizacji

  1. Korzystając z podanego poniżej kodu przygotuj aplikację wyświetlającą maksymalną, minimalną oraz średnią temperaturę zmierzoną na zarejestrowanym obrazie. W tym celu:
import cv2
import numpy as np


def calculate_temperature(thermal_frame: np.ndarray) -> np.ndarray:
    """Temperature calculation from camera raw output values.

    Parameters
    ----------
    thermal_frame : np.ndarray
        Camera raw thermal frame.

    Returns
    -------
    np.ndarray
        Output thermal frame converted to temperature in Celsius degrees.
    """
    ### TODO: Complete temperature conversion ###
    temperature = ...

    return np.round(temperature, 1)
    #####################


def show_temperature():
    """Show thermal image and display min, max, mean measured temperature."""
    cap = cv2.VideoCapture(2)
    cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter.fourcc('Y','1','6',' '))
    cap.set(cv2.CAP_PROP_CONVERT_RGB, 0)

    while True:
        ret, frame = cap.read()
        frame = frame[:120]

        if ret == False:
            break

        ### TODO: Calculate max, min and mean temperature in frame ###
        temp_max = 0
        temp_min = 0
        temp_mean = 0
        #####################

        norm = (frame - np.min(frame)) / (np.max(frame) - np.min(frame))
        color_frame = cv2.cvtColor(np.uint8(norm * 255.), cv2.COLOR_GRAY2BGR)
        
        ### TODO: Add temperature information to frame using cv2.putText method ###

        #####################

        cv2.imshow("Measured temperature", color_frame)

        k = cv2.waitKey(10)

        if k == ord('q'):
            break


if __name__ == '__main__':
    show_temperature()

Przykładowy rezultat został przedstawiony poniżej:

  1. Przygotuj skrypt usuwający wartości o niższej temperaturze niż ustalony próg. Dostosuj dynamicznie próg przy pomocy suwaka, a następnie zastąp tło (wartości poniżej progu) własnym zdjęciem. W tym celu:

Przykładowy rezultat został przedstawiony poniżej:

Zadanie dodatkowe

Przygotuj zbiór danych do klasyfikacji gestów (papier, kamień, nożyce, pozostałe/nierozpoznane) dodając własne przykłady uczące dla każdej z klas przy wykorzystaniu skryptu gesture_capture.py.

Przygotowany zbiór danych skompresuj z poziomu katalogu scripts do formatu ZIP przy pomocy polecenia zip -r dataset.zip dataset/.

Następnie korzystając z przygotowanego notatnika Google Colab wytrenuj model klasyfikacji gestów oparty o architekturę SqueezeNet. W tym celu skopiuj notatnik do swojego dysku, prześlij skompresowany zbiór danych i postępuj dalej według instrukcji zawartych w notatniku.

Po wytrenowaniu, pobraniu i rozpakowaniu (komenda: unzip model.zip) używając skryptu gesture_recognition.py wczytaj model rozpoznawania gestów i przetestuj jego działanie.

Przykładowe wyniki zostały przedstawione poniżej: